// routes/users.js
const express = require('express');
const router = express.Router();
const bcrypt = require('bcryptjs'); // 引入加密库
const jwt = require('jsonwebtoken');
const User = require('../models/User');

// 引入日志工具
const logger = require('../utils/logger');

// --- 用户注册 API (已集成密码加密) ---
// @route   POST /api/users/register
// @desc    注册一个新用户
// @access  Public
router.post('/register', async (req, res) => {
    try {
        const { username, email, password } = req.body;
        
        logger.route('USER_REGISTER', 'Received registration request', { username, email });

        // 1. 检查用户是否已存在
        logger.db('USER_REGISTER', 'Checking if user already exists', { email });
        let user = await User.findOne({ email });
        if (user) {
            logger.warn('USER_REGISTER', 'User already exists', { email });
            return res.status(400).json({ msg: 'User already exists' });
        }

        // 2. 创建新用户实例
        user = new User({
            username,
            email,
            password
        });

        // 3. 【安全核心】对密码进行哈希加密
        // 讲解：我们使用 bcrypt 库。它会先生成一个"盐"（salt），这是一个随机字符串，
        // 然后将盐和原始密码混合在一起进行哈希计算。
        // 这样做可以确保即使两个用户设置了相同的密码，它们在数据库中的哈希值也完全不同。
        logger.debug('USER_REGISTER', 'Generating salt for password hashing');
        const salt = await bcrypt.genSalt(10); // 10是安全强度，数值越大越安全但越耗时
        logger.debug('USER_REGISTER', 'Hashing password');
        user.password = await bcrypt.hash(password, salt); // 生成加密后的密码

        // 4. 保存用户到数据库
        logger.db('USER_REGISTER', 'Saving new user to database');
        await user.save();
        logger.info('USER_REGISTER', 'User registered successfully', { userId: user.id, email });

        // 5. 注册成功，直接生成JWT并返回，实现注册后自动登录
        const payload = {
            user: {
                id: user.id
            }
        };

        logger.debug('USER_REGISTER', 'Generating JWT token');
        jwt.sign(
            payload,
            process.env.JWT_SECRET,
            { expiresIn: '5h' },
            (err, token) => {
                if (err) {
                    logger.error('USER_REGISTER', 'Error generating JWT token', err);
                    throw err;
                }
                logger.info('USER_REGISTER', 'JWT token generated successfully');
                res.json({ token });
            }
        );

    } catch (err) {
        logger.error('USER_REGISTER', 'Server error during registration', err);
        res.status(500).send('Server Error');
    }
});

// --- 用户登录 API ---
// @route   POST /api/users/login
// @desc    用户登录并获取token
// @access  Public
router.post('/login', async (req, res) => {
    try {
        const { email, password } = req.body;
        
        logger.route('USER_LOGIN', 'Received login request', { email });

        // 1. 检查用户是否存在
        logger.db('USER_LOGIN', 'Checking if user exists', { email });
        const user = await User.findOne({ email });
        if (!user) {
            logger.warn('USER_LOGIN', 'Invalid credentials - user not found', { email });
            return res.status(400).json({ msg: 'Invalid Credentials' });
        }

        // 2. 【安全核心】比较密码
        // 这里使用 bcrypt.compare 来安全地比较客户端传来的原始密码和数据库中存储的哈希密码。
        // 它会自动处理盐值，我们无需关心。只有密码匹配，才会返回true。
        logger.debug('USER_LOGIN', 'Comparing password');
        const isMatch = await bcrypt.compare(password, user.password);
        if (!isMatch) {
            logger.warn('USER_LOGIN', 'Invalid credentials - password mismatch', { email });
            return res.status(400).json({ msg: 'Invalid Credentials' });
        }

        // 3. 登录成功，生成JWT
        logger.info('USER_LOGIN', 'User login successful', { userId: user.id, email });
        const payload = {
            user: {
                id: user.id
            }
        };

        logger.debug('USER_LOGIN', 'Generating JWT token');
        jwt.sign(
            payload,
            process.env.JWT_SECRET,
            { expiresIn: '5h' },
            (err, token) => {
                if (err) {
                    logger.error('USER_LOGIN', 'Error generating JWT token', err);
                    throw err;
                }
                logger.info('USER_LOGIN', 'JWT token generated successfully');
                res.json({ token });
            }
        );

    } catch (err) {
        logger.error('USER_LOGIN', 'Server error during login', err);
        res.status(500).send('Server Error');
    }
});

module.exports = router;